package com.example.utils;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * 由于前端传递过来的音频是pcm的文件
 * 通过这个工具类来转换pcm为wav来解决格式不对的问题
 */
public class AudioConverter {
    
    /**
     * 将PCM音频数据转换为WAV格式
     * @param pcmData PCM音频数据
     * @param sampleRate 采样率
     * @param sampleSizeInBits 采样位数
     * @param channels 声道数
     * @return WAV格式的音频数据
     * @throws IOException
     */
    public static byte[] pcmToWav(byte[] pcmData, float sampleRate, int sampleSizeInBits, int channels) throws IOException {
        // 创建音频格式
        AudioFormat format = new AudioFormat(
                sampleRate,          // 采样率
                sampleSizeInBits,    // 采样位数
                channels,            // 声道数
                true,                // 是否带符号
                false                // 是否大端序
        );

        // 创建音频输入流
        ByteArrayInputStream bais = new ByteArrayInputStream(pcmData);
        AudioInputStream audioInputStream = new AudioInputStream(bais, format, pcmData.length / format.getFrameSize());

        // 创建输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // 写入WAV文件头并转换格式
        AudioSystem.write(audioInputStream, javax.sound.sampled.AudioFileFormat.Type.WAVE, baos);

        // 关闭流
        audioInputStream.close();
        bais.close();
        baos.close();

        return baos.toByteArray();
    }

    /**
     * 将PCM音频数据转换为WAV格式（使用默认参数）
     * @param pcmData PCM音频数据
     * @return WAV格式的音频数据
     * @throws IOException
     */
    public static byte[] pcmToWav(byte[] pcmData) throws IOException {
        // 使用常用参数：16kHz采样率，16位深度，单声道
        return pcmToWav(pcmData, 16000.0f, 16, 1);
    }
} 